Understanding program behavior is at the foundation of computer architecture and program optimization. Many programs have wildly different behavior on even the very largest of scales (such as over the complete execution of the program). This realization has ramifications for many architectural and compiler techniques, from thread scheduling, to feedback directed optimizations, to the way programs are simulated. However, in order to take advantage of time-varying behavior, analytical tools are needed to analyze program behavior over sections of execution.
For example, in architecture research, it is frequently necessary to take one instance of a program with a given input, and analyze its performance over many different architecture configurations. In a nonlimiting example, a single binary with one input set may be run hundreds or thousands of times to examine how the effectiveness of a given architecture changes with its size. Where the program is simulated can have a great impact on the accuracy of the results.